package com.hsylient.javase.chapter04.demo04;

/*
    使用泛型的静态方法
 */
public class GenericMethod {
    public static void main(String[] args) {
        // 使用泛型后可以展示String类型的数组
        String[] arr1 = { "烤羊排", "土豆牛肉", "黄焖鸡米饭", "烤羊肉串", "烤韭菜", "烤蒜" };
        printArray(arr1);
        // 使用泛型后还可以展示Integer类型的数组
        Integer[] arr2 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
        printArray(arr2);

        String string类型 = test("String类型");
        Integer Integer类型 = test(312);
    }


    /**
     * 该方法使用泛型之后，可以展示任意类型的数组中的数据
     *
     * @param arr 通过用户指定数组的类型，同时约束自定义泛型对应的具体数据类型
     * @param <T> 自定义泛型无意义占位符
     */
    public static <T> void printArray(T[] arr) {
        for (T t : arr) {
            System.out.println(t);
        }
    }

    /**
     * 带有自定义泛型声明的方法
     *
     * @param <T> 自定义泛型无意义占位符
     * @param t 指定的泛型数据类型，由用户约束
     * @return 对应的T类型， 具体数据类型由用户约束
     */
    public static <T> T test(T t) {
        return t;
    }

    /**
     * 为什么类名自定义的泛型(泛型类上的泛型)不能用于当前类内的静态成员方法
     * 静态成员方法是在类文件的加载阶段准备完毕，已经可以明确的保证该方法的是可以执行的。
     * <p>
     * 如果使用类声明的自定义泛型，对应泛型的具体数据类型需要在创建类对象之后才可以明确。
     * 当前静态方法在类文件加载阶段无法明确泛型数据类型是哪一个，也就无法保证执行，【没有对象】
     * <p>
     * 如果方法想要使用自定义泛型，自娱自乐，自己定义自己用！！！
     * 要求自定义的泛型占位符和类声明泛型占位符不一致，避免没有必要的歧义，提高阅读性
     *
     * @param e   泛型参数，在方法调用的时候，指明参数的类型
     * @param <E> 自定义泛型无意义占位符
     * @return 返回值得类型由参数的类型决定
     */
    public static <E> E staticMethod(E e) {
        return e;
    }
}
